#include "menuplugin.h"
#include <peony-qt/file-info.h>

#include <QFileInfo>
#include <QLocale>
#include <QApplication>
#include <QProcess>
#include <QDebug>
#include <QObject>

#include "fileoperation.h"

#include <peony-qt/file-utils.h>

using namespace Peony;

MenuPlugin::MenuPlugin(QObject *parent)
    : QGenericPlugin(parent)
{
}

QObject *MenuPlugin::create(const QString &name, const QString &spec)
{
}

QList<QAction *> MenuPlugin::menuActions(Types types, const QString &uri, const QStringList &selectionUris)
{
    QList<QAction *> actions;

    //判定点击位置是目录视图区或者桌面区，其他位置不可使用右键菜单，例如：左侧边栏
    if(types != MenuPluginInterface::DirectoryView && types != MenuPluginInterface::DesktopWindow)
    {
        return actions;
    }

    //选中文件为空时，不可使用右键菜单
    if(selectionUris.isEmpty())
    {
        return actions;
    }

    //选中文件为计算机、垃圾箱或者其他虚拟路径时，也不可使用右键菜单
    if(!selectionUris.first().startsWith("file:///"))
    {
        return actions;
    }

    QStringList selectionPath;

    for(auto uri : selectionUris) {
        QString tmp = FileUtils::urlDecode(uri);
        selectionPath.append(tmp.remove("file://"));
    }

    //检查选中的文件是否存在已经加密的文件，如果存在已加密文件，并且选中文件个数是1，那么可以显示解密菜单
    if(encryptedFileExist(selectionPath)) {
        if(selectionUris.size() == 1) {
            QAction *decrypt = new QAction(QString("decrypt file"), nullptr);
            actions << decrypt;
            connect(decrypt, &QAction::triggered, [=]() {
               QProcess p;
               p.setProgram("/usr/bin/decrypt");
               p.setArguments(selectionPath);
               p.startDetached(p.program(), selectionPath);
               p.waitForFinished(-1);
            });
        }
    } else {
        QAction *encrypt = new QAction(QString("encrypt files"), nullptr);
        actions << encrypt;
        connect(encrypt, &QAction::triggered, [=]() {
            QProcess p;
            p.setProgram("/usr/bin/encrypt");
            p.setArguments(selectionPath);
            p.startDetached(p.program(), selectionPath);
            p.waitForFinished(-1);
        });
    }

    return actions;
}

bool MenuPlugin::encryptedFileExist(const QStringList &selectionPath)
{
    for(auto path : selectionPath)
    {
        if(FileOperation::isEncryptFile(path))
        {
            return true;
        }
    }

    return false;
}
